package src.main.java.action;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.ws.axis2.xsd.ServiceResponse;

import src.main.java.entity.CarrinhoTO;
import src.main.java.entity.ClienteTO;
import src.main.java.entity.EnderecoTO;
import src.main.java.entity.PedidoTO;
import src.main.java.entity.ProdutoTO;
import src.main.java.modules.container.EnderecoCaller;
import src.main.java.modules.container.ValidacaoDeCreditoCaller;

import com.opensymphony.xwork2.ActionSupport;

public class CarrinhoAction extends ActionSupport implements ServletRequestAware, ServletResponseAware, SessionAware {
	
	private HttpServletRequest request;
	private HttpServletResponse response;
	private Map<String, Object> session;
	
	private ProdutoTO produto;
	private CarrinhoTO carrinho;
	private PedidoTO pedido;
	private ClienteTO cliente;
	private Long codigo;
	private String feedback;

	@Action(value = "/finalizarCompra", results = {
			@Result(location = "index.jsp", name = "fail"),
			@Result(location = "finalizar.jsp", name = "ok"), 
			@Result(location = "login.jsp", name = "nao_logado")}
	)
	public String finalizaCompra(){
		cliente = (ClienteTO) session.get("cliente");
		
		if(cliente == null){
			request.setAttribute("origem", "carrinho");
			return "nao_logado";
		} 
		
		pedido = new PedidoTO();
		pedido.setCliente(cliente);
		
		EnderecoTO endereco = new EnderecoTO();
		if (cliente.getCep() != null){
			endereco = EnderecoCaller.buscaPorCep(cliente.getCep().toString());
		}
		pedido.setEndereco(endereco);

		carrinho = (CarrinhoTO) session.get("carrinho");
		if(carrinho.getProdutos().size()>0){
			pedido.setProdutos(carrinho.getProdutos());
			pedido.setSubTotal(carrinho.getValorTotal());
			
			//verificacao do componente de credito
			try {
				ServiceResponse score = ValidacaoDeCreditoCaller.getScoreByCpf(cliente.getCpf());
				if(score != null && "X".equals(score.getScore())){
					pedido.setPodePagarComBoleto(false);
				}
			} catch (Exception e) {
				//nao faca nada. so considere que pode vender com qqr forma de pagamento :D
			}
			
			session.put("pedido", pedido);
			return "ok";
		}
		else return "fail";
	}
	
	@Action(value = "/adicionarProduto", results = {
			@Result(location = "carrinho.jsp", name = "ok"),
			@Result(location = "carrinho.jsp", name = "fail") }
	)
	public String adicionarProduto(){
		List<ProdutoTO> produtos = (List<ProdutoTO>)session.get("produtos");
		produto = new ProdutoTO();
		for(ProdutoTO prod: produtos){
			if(prod.getCodigo().equals(codigo)){
				produto.setCodigo(prod.getCodigo());
				produto.setNome(prod.getNome());
				produto.setPeso(prod.getPeso());
				produto.setUrlImage(prod.getUrlImage());
				produto.setValor(prod.getValor());
				produto.setVolume(prod.getVolume());
				produto.setQuantidade(1);
			}
		}
		
		carrinho = (CarrinhoTO)session.get("carrinho");
		
		if(carrinho==null){
			carrinho = new CarrinhoTO();
		}
		
		if(carrinho.adicionarProduto(produto)){
			session.put("carrinho", carrinho);
			return "ok";
		}
		else {
			feedback = "semEstoque";
			return "fail";
		}
	}
	
	@Action(value = "/removerProduto", results = {
			@Result(location = "carrinho.jsp", name = "ok"),
			@Result(location = "carrinho.jsp", name = "fail") }
	)
	public String removerProduto(){
		carrinho = (CarrinhoTO)session.get("carrinho");
		
		if(carrinho==null){
			carrinho = new CarrinhoTO();
		}
		
		if(carrinho.getProdutos().size()>0){
			carrinho.removerProduto(codigo);
			
			if(carrinho.getProdutos().size()==0){
				session.remove("carrinho");
			}
			else {
				session.put("carrinho", carrinho);
			}
			
			return "ok";
		}
		else {
			return "fail";
		}
	}
	
	public ProdutoTO getProduto() {
		return produto;
	}

	public void setProduto(ProdutoTO produto) {
		this.produto = produto;
	}
	public CarrinhoTO getCarrinho() {
		return carrinho;
	}

	public void setCarrinho(CarrinhoTO carrinho) {
		this.carrinho = carrinho;
	}
	
	@Override
	public void setServletResponse(HttpServletResponse arg0) {
		this.response = arg0;
	}

	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		this.request = arg0;
	}

	@Override
	public void setSession(Map<String, Object> arg0) {
		this.session = arg0;		
	}
	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public PedidoTO getPedido() {
		return pedido;
	}

	public void setPedido(PedidoTO pedido) {
		this.pedido = pedido;
	}

	public String getFeedback() {
		return feedback;
	}

	public void setFeedback(String feedback) {
		this.feedback = feedback;
	}
}
